<?php
/**
 * Контроллер административной панели, реализующий управление пользователями
 * 
 * @category Phorm
 * @package Controller_Module_Control
 * @name /Phorm/Controller/Module/Control/Users.php
 * @copyright phorm.ru
 * @since 05.05.2012
 * @author vladimir@kachalov.net
 */

class Phorm_Controller_Module_Control_Users extends Phorm_Controller_Controller {
	
	/**
	 * Экземпляр класса пользователей
	 * @var Phorm_User
	 */
	public $User;
	
	
	/**
	 * Предиспетчер
	 * 
	 * @return void
	 */
		
	public function preDispatch() {
		
		$this->User = new Phorm_User();
		
	}
	
	
	/**
	 * Главная страница - Список пользователей
	 * 
	 * @return void
	 */
		
	public function indexAction() {
		
		$options = $this->User->getGridOptions();
		
		if($this->_request->isXmlHttpRequest()) {
			
			$rows = $this->User->getUsersList($this->_params);
			$paginator = $this->User->getPaginator();

			$this->_helper->json(Phorm_JQuery_DataGrid::data($rows,$paginator,$options));
			
		} else {
			
			$this->view->assign('UsersDataTable',$this->view->DataGrid('UsersDataTable',$options));
			
		}
		
	}
	
	
	/**
	 * Создание пользователя
	 * 
	 * @return void
	 */
	
	public function addAction() {
		
		$form = $this->User->getUserForm('add');
		
		if($this->_request->isPost() && $form->isValid($this->_request->getPost())) {
			$FormData = $form->getValues();
			if($FormData = $this->User->saveUserInfo($FormData)) {
				return $this->composeSuccessMessage('Пользователь создан','/control/users/');
			} else {
				$this->composeTransactionErrorMessage($this->User->_errors);		
			}
		}
		
		$this->view->assign('Form',$form);
		
	}
	
	
	/**
	 * Редактирование пользователя
	 * 
	 * @return void
	 */
	
	public function editAction() {
		
		if(isset($this->_params['userid']) && $UserInfo = $this->User->getUserInfo(array('userid'=>$this->_params['userid']))) {
			
			$form = $this->User->getUserForm('edit');
			$form->setDefaults($UserInfo);
			
			if($this->_request->isPost()) {
				
				$FormData = $this->_request->getPost();
				
				// Нередактируемые поля
				$FormData['userid'] = $UserInfo['userid'];
				$FormData['username'] = $UserInfo['username'];
				
				if($form->isValid($FormData)) {
					$FormData = $form->getValues();
					if($FormData = $this->User->saveUserInfo($FormData)) {
						return $this->composeSuccessMessage('Изменения внесены','/control/users/');
					} else {
						$this->composeTransactionErrorMessage($this->User->_errors);
					}
				}
				
			}
			
			$this->view->assign('Form',$form);
			
		} else {
			
			return $this->composeErrorMessage('Пользователь с указанным Id не найден','/control/users/');
			
		}
		
	}
	
	
	/**
	 * Удаление пользователя
	 * 
	 * @return void
	 */
	
	public function deleteAction() {
		
		$redirect = '/control/users/';
		
		if(isset($this->_params['userid']) && $UserInfo = $this->User->getUserInfo(array('userid'=>$this->_params['userid']))) {
		
			if($this->User->deleteUser($UserInfo)) {
				return $this->composeSuccessMessage('Выбранный пользователь удален',$redirect);
			} else {
				return $this->composeDeleteErrorMessage($this->User->_errors,$redirect);
			}
		
		} else {
			
			return $this->composeErrorMessage('Пользователь с указанным Id не найден',$redirect);
			
		}
		
	}
	
	
	/**
	 * Список ролей
	 * 
	 * @return void
	 */
	
	public function rolesAction() {
		
		$options = $this->User->getGridOptions('roles');
		
		if($this->_request->isXmlHttpRequest()) {
			
			$rows = $this->User->getRolesList();
			$paginator = $this->User->getPaginator();

			$this->_helper->json(Phorm_JQuery_DataGrid::data($rows,$paginator,$options));
			
		} else {
			
			$this->view->assign('RolesDataTable',$this->view->DataGrid('RolesDataTable',$options));
			
		}
		
	}
	
	
	/**
	 * Создание роли
	 * 
	 * @return void
	 */
	
	public function roleaddAction() {
		
		$form = $this->User->getUserForm('roleadd');
		
		if($this->_request->isPost() && $form->isValid($this->_request->getPost())) {
			if($this->User->saveRoleInfo($form->getValues())) {
				return $this->composeSuccessMessage('Группа создана','/control/users/roles/');		
			} else {
				$this->composeTransactionErrorMessage($this->User->_errors);	
			}
		}
		
		$this->view->assign('Form',$form);
		
	}
	
	
	/**
	 * Редактирование роли
	 * 
	 * @return void
	 */
	
	public function roleeditAction() {
		
		if(isset($this->_params['roleid']) && $RoleInfo = $this->User->getRoleInfo($this->_params['roleid'])) {
		
			$form = $this->User->getUserForm('roleedit');
			$form -> setDefaults($RoleInfo);
			
			if($this->_request->isPost() && $form->isValid($this->_request->getPost())) {
				$FormData = $form->getValues();
				$FormData['roleid'] = $RoleInfo['roleid'];
				if($this->User->saveRoleInfo($FormData)) {
					return $this->composeSuccessMessage('Изменения внесены','/control/users/roles/');	
				} else {
					$this->composeTransactionErrorMessage($this->User->_errors);
				}
			}
			
			$this->view->assign('Form',$form);
		
		} else {
			
			return $this->composeErrorMessage('Группа с указанным Id не найдена','/control/users/roles/');
			
		}
		
	}
	
	
	/**
	 * Удаление роли
	 * 
	 * @return void
	 */
	
	public function roledeleteAction() {
		
		$redirect = '/control/users/roles/';
		
		if(isset($this->_params['roleid']) && $RoleInfo = $this->User->getRoleInfo($this->_params['roleid'])) {
		
			if($this->User->deleteRole($RoleInfo)) {
				return $this->composeSuccessMessage('Выбранная группа удалена','/control/users/roles/');
			} else {
				return $this->composeDeleteErrorMessage($this->User->_errors);
			}
		
		} else {
			
			return $this->composeErrorMessage('Группа с указанным Id не найдена',$redirect);
			
		}
		
	}
	
	
	/**
	 * Редактирование собственного профиля 
	 * 
	 * @return void
	 */
		
	public function profileAction() {
		
		if($this->_usersession->UserData['userid'] > 0 && $UserInfo = $this->User->getUserInfo(array('userid'=>$this->_usersession->UserData['userid']))) {
			
			$form = $this->User->getProfileForm();
			
			$form->setDefaults($UserInfo);
			
			if($this->_request->isPost()) {
				
				$FormData = $this->_request->getPost();
				
				// Нередактируемые поля
				$FormData['userid'] = $UserInfo['userid'];
				$FormData['username'] = $UserInfo['username'];
				
				if($form->isValid($FormData)) {
					$FormData = $form->getValues();
					unset($FormData['signed'],$FormData['lastvisit']);
					if($FormData = $this->User->saveUserInfo($FormData)) {
						$this->User->_usersession->UserData = $this->User->getUserInfo(array('userid'=>$FormData['userid']));
						return $this->composeSuccessMessage('Изменения внесены','/control/users/profile/');
					} else {
						$this->composeTransactionErrorMessage($this->User->_errors);
					}
				}
				
			}
			
			$this->view->assign('Form',$form);
			
		} else {
			
			return $this->composeErrorMessage('Пользователь с указанным Id не найден','/users/');
			
		}
			
	}
	
}